package Day_0215.JVM;

/**
 * @author zxc
 * @date 2023/02/15 22:01
 **/
public class Object_Access_Location {
    public static void main(String[] args) {
        /**
         * 对象的访问定位
         * ===》
         * 1.Java 程序需要通过 JVM 栈上的引用，访问堆中的具体对象。
         * 对象的访问方式取决于 JVM 虚拟机的实现。
         *
         * 2.目前主流的访问方式有 句柄 和 直接指针 两种方式。
         * 1）指针：
         *  指向对象，代表一个对象在内存中的起始地址。
         * ===》
         * （1）对象引用中存储的，直接就是对象地址，该对象内部同时应该也包含指向对象类型的指针;
         * （2）优势 ：
         *  速度更快，节省了一次指针定位的时间开销。
         *  由于对象的访问在 Java 中非常频繁，因此这类开销积少成多后，也是非常可观的执行成本。
         *  HotSpot 中采用的就是这种方式。
         *
         * 2）句柄：
         *  可以理解为 指向指针的指针，维护着对象的指针;
         *  句柄不直接指向对象，而是指向对象的指针（句柄不发生变化，指向固定内存地址），再由对象的指针指向对象的真实内存地址。
         *  ===》
         *  （1）Java堆中，划分出一块内存作为句柄池;
         *   对象引用中，所存储的是对象句柄;
         *   而对象的句柄中，又存储指向对象类型的指针 && 指向对象实例的指针;
         *  （2）优势 ：
         *   对象引用中，存储的是稳定的句柄地址;
         *   在对象被移动（垃圾收集时移动对象是非常普遍的行为）时，只会改变句柄中的实例数据指针，而引用本身不需要修改;
         *
         */
    }
}
